package java_cup.runtime;

/**
 * Defines the Symbol class, which is used to represent all terminals
 * and nonterminals while parsing.  The lexer should pass CUP Symbols 
 * and CUP returns a Symbol.
 *
 * @version last updated: 7/3/96
 * @author  Frank Flannery
 */

/*******************************************************************************
 * Class Symbol what the parser expects to receive from the lexer. the token is
 * identified as follows: sym: the symbol type parse_state: the parse state.
 * value: is the lexical value of type Object left : is the left position in the
 * original input file right: is the right position in the original input file
 ******************************************************************************/

public class Symbol {

	/***************************************************************************
	 * Constructor for l,r values
	 **************************************************************************/

	public Symbol(int id, int l, int r, Object o) {
		this(id);
		left = l;
		right = r;
		value = o;
	}

	/***************************************************************************
	 * Constructor for no l,r values
	 **************************************************************************/

	public Symbol(int id, Object o) {
		this(id, -1, -1, o);
	}

	/***************************************************************************
	 * Constructor for no value
	 **************************************************************************/

	public Symbol(int id, int l, int r) {
		this(id, l, r, null);
	}

	/***************************************************************************
	 * Constructor for no value or l,r
	 **************************************************************************/

	public Symbol(int sym_num) {
		this(sym_num, -1);
		left = -1;
		right = -1;
		value = null;
	}

	/***************************************************************************
	 * Constructor to give a start state
	 **************************************************************************/
	Symbol(int sym_num, int state) {
		sym = sym_num;
		parse_state = state;
	}

	/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

	/** The symbol number of the terminal or non terminal being represented */
	public int sym;

	/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

	/**
	 * The parse state to be recorded on the parse stack with this symbol. This
	 * field is for the convenience of the parser and shouldn't be modified
	 * except by the parser.
	 */
	public int parse_state;

	/**
	 * This allows us to catch some errors caused by scanners recycling symbols.
	 * For the use of the parser only. [CSA, 23-Jul-1999]
	 */
	boolean used_by_parser = false;

	/***************************************************************************
	 * The data passed to parser
	 **************************************************************************/

	public int left, right;

	public Object value;

	/***************************************************************************
	 * Printing this token out. (Override for pretty-print).
	 **************************************************************************/
	public String toString() {
		return "#" + sym;
	}
}
